/**
 * axios 取消重复的请求
 */

// todo 用来给参数对象进行序列化转换;(使用在node相关的工程文件中时可直接 const qs = require('qs'))
// const qs = Qs;

// 存储正在请求的数据
const pendingRequest = new Map();

/**
 * 根据当前请求的参数以及URL等信息, 生成请求key
 * @param {*} config 请求参数信息
 * @returns 
 */
function generateReqKey(config) {
  const { method, url, params, data } = config;
  // todo 模块化时需要把 Qs 替换
  return [method, url, Qs.stringify(params), Qs.stringify(data)].join("&");
}

/**
 * 用于把当前请求信息添加到 pendingRequest 对象中；
 * @param {*} config 请求参数信息
 */
function addPendingRequest(config, axios) {
  const requestKey = generateReqKey(config);
  config.cancelToken = config.cancelToken || new axios.CancelToken((cancel) => {
    if (!pendingRequest.has(requestKey)) {
      pendingRequest.set(requestKey, cancel);
    }
  });
}

/**
 * 检查是否存在重复请求，若存在则取消已发的请求。
 * @param {*} config 请求参数信息
 */
function removePendingRequest(config) {
  const requestKey = generateReqKey(config);
  if (pendingRequest.has(requestKey)) {
    const cancelToken = pendingRequest.get(requestKey);
    cancelToken(requestKey);
    pendingRequest.delete(requestKey);
  }
}

// todo 如使用模块化编写时可使用 export 输出
// export {
//   generateReqKey,
//   removePendingRequest,
//   addPendingRequest
// }